package student.aistar.day12.inner;

/**
 * 成员内部类, 静态内部类, 局部内部类, 匿名内部类
 */
public class Outer {//外部类
    private int id = 10;//普通属性

    private static int sid = 100; //静态属性

    //1.成员内部类 - 把内部类看成是外部类的一种成员
    public class MemberInner{

        //定义非静态属性
        private int id = 20; //ok

        private int age = 18;

        //成员内部类是不允许定义静态成员的
//        private static int sid = 200;//error

        public MemberInner(){
            System.out.println("MemberInner");
        }

        //自定义方法
        public void test(){
            //内部类访问自己的属性
            System.out.println("内部类age: " + age);
            System.out.println("内部类-id: " + this.id);
            System.out.println("外部类-id: " + Outer.this.id);
            System.out.println("外部类-sid: " + Outer.sid);
        }
    }

    //提供一个公开的方法, 来直接返回这个内部类对象
    public MemberInner getMemberInnerInstance(){
        return new MemberInner();
    }

    //2.静态内部类 - 把内部类看成是外部类的一个静态成员
    //如果内部类是一个静态的, 已经上升成为了顶级类
    public static class StaticMemberInner{
        //定义非静态属性
        private int id = 20;
        //定义一个静态属性
        private static int sid = 200;
        public StaticMemberInner(){
            System.out.println("StaticMemberInner");
        }

        public void test(){
            System.out.println("内部类-id: " + this.id);

            //静态类的非静态方法中不允许访问外部类中的非静态属性
//            System.out.println("外部类-id: " + Outer.this.id);

            System.out.println("内部类-sid: " + sid);
            System.out.println("外部类-sid: " + Outer.sid);
        }
    }
    public void testLocalInner(){
        //局部内部类 - 生命周期仅仅存在于这个方法中
        class LocalInner{
            public LocalInner(){
                System.out.println("LocalInner()....");
            }

            private int id = 100;

            //不能定义静态属性的方法, 否则调用非静态的参数时会报错
            public void test(){
                System.out.println("内部类的id-" + id);
                System.out.println("外部类的id- " + Outer.this.id);
                System.out.println("外部类的sid- " + Outer.sid);
            }

        }
        //创建内部类的对象
        LocalInner localInner = new LocalInner();
        localInner.test();
    }

    public static void main(String[] args) {
        //匿名内部类
        A a = new A() {
            @Override
            public void add() {
                System.out.println("匿名内部类");
            }
        };
    }
}

@FunctionalInterface
interface A{
    void add();
}